namespace study4_04 {

    // instanceof
    // instanceof操作符用于检测一个对象是否为某个类或其子类的实例

    // 基本用法
    // instanceof 检测的是对象的原型链，因此可以判断出对象是否是某个构造函数创建的实例

    // 示例：
    class Animal {
        constructor(public name: string) {
            this.name = name
        }
    }

    class Dog extends Animal {
        constructor(
            name: string,
            public breed: string
        ) {
            super(name)
            this.breed = breed
        }


    }

    let myDog = new Dog('志超', '金毛')
    console.log(myDog instanceof Dog); // true
    console.log(myDog instanceof Animal); // true
    console.log(myDog instanceof Object); // true



    // instanceof 与类型保护（必考！！！！）
    // 在ts中，instanceof可以用作类型保护。它允许在某个条件分支中将对象的类型缩小为特点的类，
    // 这样可以在该分支中更安全地访问对象的属性和方法

    // 示例：
    class Bird2 {
        fly() {
            console.log('flying...');

        }
    }

    class Fish2 {
        swim() {
            console.log('swimming....');

        }
    }

    function move(animal2: Bird2 | Fish2) {
        if (animal2 instanceof Bird2) {
            animal2.fly()
        } else if (animal2 instanceof Fish2) {
            animal2.swim()
        }

    }
    // 在这个例子中，instanceof用于类型保护，使得ts能够在if分支中精确推断animal的类型



    // instanceof 与自定义类
    // instanceof 主要用于检测由类（或者构造函数）创建的实例，对于基本类型或接口和抽象类无效

    // 示例：
    interface Car {
        drive(): void
    }
    abstract class Car2 {
        abstract drive(): void
    }
    class Sedan implements Car {
        drive(): void {
            console.log('Driving....');

        }
    }
    let myCar = new Sedan()
    console.log(myCar instanceof Sedan);
    // console.log(myCar instanceof Car);// “Car”仅表示类型
    console.log(myCar instanceof Car2); // false  因为 `Car2` 是抽象类，不是类



    // instanceof 与内置类型
    // 可以使用instanceof 来检测某些内置类型

    // 示例：
    let arr = [1, 2, 3]
    let data = new Date()
    let error = new Error('something went wrong')
    console.log(arr instanceof Array); // true
    console.log(data instanceof Date); // true
    console.log(error instanceof Error); // true


    // instanceof 的局限性
    // 原型链被修改的情况：如果对象的原型链被动态修改，instanceof 的判断结果可能会出乎意料。
    // 不同执行环境：如果两个对象在不同的执行环境（例如两个不同的 iframe）中创建，instanceof 可能会失败，即使它们来自同一个构造函数。



    // 总结
    // 1、基本功能：instanceof用于检测对象是否是某个类或其子类的实例
    // 2、类型保护：在ts中，instanceof常用于类型保护中，帮助ts在条件分支中进行更精确的类型推断
    // 3、局限性：instanceof只能用于类，而不能用于接口或类型别名。并且在某些复杂情况（例如跨环境的对象），它可能不能正确工作


}